﻿#ifndef PLCCOMMOPCUA_H
#define PLCCOMMOPCUA_H
#include "PLCReadThread.h"
#include "PLCWriteThread.h"
#include <QThread>


/**
 * @brief The PLCCommOPCUA class 这个类用于和 PLC 通讯。
 *           内部按照 0.5s 一次的时间间隔，不停的轮询 PLC 内部的数据
 *           从这里读取 PLC 数据时有两种方式，一种时访问 PLC，返还 PLC 当前值
 *           另一种是读取 这个类内部缓存的数据。通常我们都应该用缓存的数据。
 */
class PLCCommOPCUA : public QObject
{
    friend PLCWriteThread;
    friend PLCReadThread;
    Q_OBJECT
public:
    explicit PLCCommOPCUA(QObject *parent = nullptr);
    ~PLCCommOPCUA();

    //OPC UA初始化
    void init(const QString& endpointUrl);

    void start();

    void writeValveStatus(int valveChannel, bool status);
    void writeAllValveStatus(const QVector<bool>& status);

    //流量计操作接口
    void writeFlowRate(int flowmeterChannel, int16_t inputValue);
    void writeAllFlowRate(const QVector<int16_t>& inputValue);

    //压力计操作接口
    void writePressure(int pressuremeterChannel, int16_t inputValue);
    void writeAllPressure(const QVector<int16_t>& inputValue);

    //MKS设备操作接口
    void writeMKS(int16_t pressure, int16_t openingAmplitude, int16_t switchMode);

    //温度设备操作接口
    void writeTemperature(bool status1, bool status2, int16_t temperature1, int16_t temperature2);


    //阀门操作接口
    bool readValveStatus(int valveChannel);
    //流量计操作接口
    double readFlowRate(int flowmeterChannel);
    //压力计操作接口
    double readPressure(int pressuremeterChannel);
    //MKS设备操作接口
    void readMKS(double &pressure, int16_t &openingAmplitude);
    //温度设备操作接口
    void readTemperature(double &temperature1, double &temperature2);
    //其他设备操作接口
    bool readOtherValveStatus(int valveChannel);

protected:


private:
    Open62541* m_client;          //OPC UA客户端实例
    PLCReadThread *m_pReadThread;
    PLCWriteThread *m_pWriteThread;

    QMutex m_mutex;               //线程安全锁

    bool m_valveStatus[11];
    double m_flowMeter[9];
    double m_pressureMeter[2];
    double m_temperature[2];
    double m_mks_pressure;
    int16_t m_mks_openingAmplitude;
    bool m_otherValveStatus[8];
    int16_t m_otherData[8];
};

#endif // PLCCOMMOPCUA_H
